suppressPackageStartupMessages({
  library(Seurat)
  library(org.Dr.eg.db)
  library(BSgenome.Drerio.UCSC.danRer11)
  library(Signac)
  library(knitr)
  library(kableExtra)
  library(dplyr)
  library(ggplot2)
  library(ggsci)
  library(limma)
  library(JASPAR2020)
  library(patchwork)
  library(TFBSTools)
  library(motifmatchr)
  library(AnnotationHub)
  library(harmony)
})
options(future.globals.maxSize = 4000 * 1024^2)
mypal <- pal_igv(palette = "default",alpha = 1)(30)

2. Read data

HB13hpf <- readRDS(file = "RDSfiles/HB13hpf_neural.RDS")
DefaultAssay(HB13hpf) <- "SCT"
Idents(HB13hpf) <- "Clusters"
HB16hpf <- readRDS(file = "RDSfiles/HB16hpf_neural.RDS")
DefaultAssay(HB16hpf) <- "SCT"
Idents(HB16hpf) <- "Clusters"
HB.int <- readRDS(file = "RDSfiles/int.neural.3WT.subset.RDS")
DefaultAssay(HB.int) <- "SCT"
DimPlot(HB.int, reduction = "wnn.umap") + scale_color_igv()

HB.int$intClusters <- as.character(HB.int$intClusters)
HB.int$intClusters[HB.int$intClusters %in% c("r1&r2.1","r1&r2.2")] <- "r1&r2"
HB.int$intClusters[HB.int$intClusters %in% c("r3.1")] <- "r3"
HB.int$intClusters[HB.int$intClusters %in% c("r4.1","r4.2")] <- "r4"
HB.int$intClusters[HB.int$intClusters %in% c("r5.1","r5.2")] <- "r5"
HB.int$intClusters[HB.int$intClusters %in% c("r6.1","r6.2")] <- "r6"
HB.int$intClusters <- droplevels(as.factor(HB.int$intClusters))
Idents(HB.int) <- "intClusters"
levels(HB.int)
 [1] "CaudHB.1"      "CaudHB.2"      "CaudHB.3"      "CaudHB.4"      "Ciliated"      "HB"            "MB.1"         
 [8] "MB.2"          "MB.3"          "MHB.1"         "MHB.2"         "MHB.3"         "MHB.4"         "MHB.5"        
[15] "MHB.6"         "Mitochondrial" "NC.1"          "NC.2"          "Neurog"        "Neuron.1"      "Neuron.2"     
[22] "r1"            "r1&r2"         "r2"            "r3"            "r4"            "r5"            "r6"           
[29] "SC.1"          "SC.2"          "SC.3"          "SC.4"         
levels(HB.int) <- c("r1","r1&r2","r2","r3","r4","r5","r6","CaudHB.1","CaudHB.2","CaudHB.3","CaudHB.4","Ciliated","HB","MB.1","MB.2",
                    "MB.3","MHB.1","MHB.2","MHB.3","MHB.4","MHB.5","MHB.6","Mitochondrial","NC.1","NC.2","Neurog","Neuron.1", 
                    "Neuron.2","SC.1","SC.2","SC.3","SC.4")

3. Heatmaps

3.1 HB13hpf top5 DE genes

All.markers.13 <- FindAllMarkers(HB13hpf, only.pos = T, verbose = F)
top5.pval.13 <- All.markers.13 %>% group_by(cluster) %>% top_n(n=-5, wt = p_val) %>% top_n(n=5, wt = avg_log2FC)
top5.pval.13
Idents(HB13hpf) <- "Clusters"
HB13hpf <- RenameIdents(HB13hpf, "FB.1" = "FB.1       ")
heatmapPlot.13 <- DoHeatmap(HB13hpf, features = unique(top5.pval.13$gene), group.colors = mypal, 
                         size = 5, angle = 45) + 
  guides(color = FALSE) +
  theme(axis.text = element_blank())
heatmapPlot.13

3.2 HB16hpf top5 DE genes

All.markers.16 <- FindAllMarkers(HB16hpf, only.pos = T, verbose = F)
top5.pval.16 <- All.markers.16 %>% group_by(cluster) %>% top_n(n=-5, wt = p_val) %>% top_n(n=5, wt = avg_log2FC)
top5.pval.16
heatmapPlot.16 <- DoHeatmap(HB16hpf, features = unique(top5.pval.16$gene), group.colors = mypal, 
                         size = 5, angle = 45) + 
  guides(color = FALSE) +
  theme(axis.text = element_blank())
heatmapPlot.16

3. Compare r1, r3 & r5 to r2, r4 and r6

r135vs246_markers <- FindMarkers(HB.int, 
                                 ident.1 = c("r1","r3","r5"), 
                                 ident.2 = c("r2","r4","r6"), verbose = FALSE)
avg_r135vs246 <- AverageExpression(HB.int, features = rownames(r135vs246_markers), assays = "SCT")$SCT
avg_r135vs246 <- as.data.frame(avg_r135vs246) %>%
  select(r1, r2, r3, r4, r5, r6)
r135vs246_m_avg <- cbind(r135vs246_markers,avg_r135vs246)
r135over246_m_avg <- r135vs246_m_avg %>%
  filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r1 > 0 & r3 > 0 & r5 > 0)
r135over246_m_avg
r246over135_m_avg <- r135vs246_m_avg %>%
  filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r2 > 0 & r4 > 0 & r6 > 0)
r246over135_m_avg

3.1 r1/r3/r5 over r2/r4/r6

p135 <- VlnPlot(HB.int, features = rownames(r135over246_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
        idents = c("r1","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
  theme(axis.title.x = element_blank())
p135

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
                        features = rownames(r135over246_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
  dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
  kable_classic_2(full_width = F)
r1 r1&r2 r2 r3 r4 r5 r6
egr2b 0.014 0.117 0.000 3.611 0.053 4.873 0.000
epha4a 0.348 0.640 0.687 10.365 0.773 9.833 0.222
sema3fb 0.203 0.883 0.179 6.476 0.523 6.683 0.089
timp2b 0.087 0.252 0.119 2.802 0.030 2.937 0.067
nab1b 0.101 0.180 0.060 1.317 0.114 1.063 0.100
myo1cb 0.058 0.009 0.000 1.048 0.030 1.262 0.011
sema3ab 0.014 0.027 0.015 0.254 0.008 1.468 0.033
midn 0.522 1.126 1.269 3.429 1.030 4.508 1.444
gria1a 0.014 0.027 0.045 0.206 0.008 1.405 0.067
brinp2 0.043 0.054 0.090 0.849 0.053 0.810 0.033
tenm3 1.246 1.144 0.657 1.270 0.742 2.603 0.978
ackr3b 0.319 0.351 0.313 0.810 0.371 2.571 0.856
tox3 0.710 0.946 1.403 2.397 0.598 3.325 2.000
epha4l 0.319 0.829 0.552 1.365 0.561 2.095 0.856
ctnnd2b 1.014 0.973 0.970 1.810 1.212 2.238 0.589
sdk2b 0.072 0.198 0.119 0.675 0.076 0.683 0.078
celf2 1.957 1.144 2.209 1.270 1.811 4.603 0.767

3.1 r2/r4/r6 over r1/r3/r5

p246 <- VlnPlot(HB.int, features = rownames(r246over135_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
        idents = c("r1","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
  theme(axis.title.x = element_blank())
p246

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
                        features = rownames(r246over135_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
  dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
  kable_classic_2(full_width = F)
r1 r1&r2 r2 r3 r4 r5 r6
col7a1l 0.029 1.216 0.806 0.246 2.242 0.246 1.611
efnb3b 3.478 3.982 4.149 0.889 3.765 1.675 5.478
epha4b 2.304 2.883 4.284 1.857 5.379 2.889 7.322
plxna2 0.130 0.432 1.537 0.286 0.992 0.175 0.322
ddr1 1.551 1.180 3.000 1.190 2.318 1.659 2.944
qkib 0.783 0.802 1.030 1.000 2.583 1.127 1.878

4. Compare r1 & r2 to rest

r12vsRest_markers <- FindMarkers(HB.int, 
                                 ident.1 = c("r1","r1&r2","r2"), 
                                 ident.2 = c("r3","r5","r4","r6"), verbose = FALSE)
avg_r12vsRest <- AverageExpression(HB.int, features = rownames(r12vsRest_markers), assays = "SCT")$SCT
avg_r12vsRest <- as.data.frame(avg_r12vsRest) %>%
  select(r1, r2, r3, r4, r5, r6)
r12vsRest_m_avg <- cbind(r12vsRest_markers,avg_r12vsRest)
r12overRest_m_avg <- r12vsRest_m_avg %>%
  filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r1 > 0 & r2 > 0)
r12overRest_m_avg
# Restoverr12_m_avg <- r12vsRest_m_avg %>%
#   filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r3 > 0 & r4 > 0 & r5 > 0 & r6 > 0)
# Restoverr12_m_avg

4.1 r1/r2 over r3/r4/r5/r6

p12 <- VlnPlot(HB.int, features = rownames(r12overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
        idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
  theme(axis.title.x = element_blank())
p12

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
                        features = rownames(r12overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
  dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
  kable_classic_2(full_width = F)
r1 r1&r2 r2 r3 r4 r5 r6
efna2a 8.826 4.288 2.224 1.556 1.886 0.817 0.733
bmpr1ba 3.000 2.369 2.657 1.198 1.576 0.778 1.089
ek1 0.507 0.829 0.716 0.190 0.212 0.111 0.156
nrp2a 1.072 0.982 0.149 0.024 0.167 0.048 0.078
ptprn2 3.246 1.468 1.821 0.698 1.091 0.548 0.822
nr2f1b 1.609 1.288 0.806 0.206 0.705 0.063 0.256
rasal2 5.174 4.901 4.194 2.548 3.205 2.786 3.089
fgfr2 6.232 5.793 3.851 2.294 3.667 2.881 4.467
si:ch211-286o17.1 2.217 1.568 1.701 0.563 0.720 0.571 1.033
pdzrn3b 0.957 0.730 0.373 0.103 0.212 0.127 0.133
bahcc1b 1.333 2.414 0.985 0.984 1.447 0.421 0.556
arhgap29a 0.696 1.153 0.955 0.484 0.455 0.262 0.178
ror1 1.290 2.432 1.552 1.595 1.303 0.571 0.367

4.2 r3/r4/r5/r6 over r1/r2

# VlnPlot(HB.int, features = rownames(Restoverr12_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
#         idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend()
# kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
#                         features = rownames(Restoverr12_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
#   dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
#   kable_classic_2(full_width = F)

5. Compare r3 & r4 to rest

r34vsRest_markers <- FindMarkers(HB.int, 
                                 ident.1 = c("r3","r4"), 
                                 ident.2 = c("r1","r1&r2","r2","r5","r6"), verbose = FALSE)
avg_r34vsRest <- AverageExpression(HB.int, features = rownames(r34vsRest_markers), assays = "SCT")$SCT
avg_r34vsRest <- as.data.frame(avg_r34vsRest) %>%
  select(r1, r2, r3, r4, r5, r6)
r34vsRest_m_avg <- cbind(r34vsRest_markers,avg_r34vsRest)
r34overRest_m_avg <- r34vsRest_m_avg %>%
  filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r3 > 0 & r4 > 0)
r34overRest_m_avg
# Restoverr34_m_avg <- r34vsRest_m_avg %>%
#   filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r1 > 0 & r2 > 0 & r5 > 0 & r6 > 0)
# Restoverr34_m_avg

5.1 r3/r4 over r1/r2/r5/r6

p34 <- VlnPlot(HB.int, features = rownames(r34overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
        idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
  theme(axis.title.x = element_blank())
p34

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
                        features = rownames(r34overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
  dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
  kable_classic_2(full_width = F)
r1 r1&r2 r2 r3 r4 r5 r6
cyp26b1 0.174 0.802 1.642 2.190 3.508 0.151 0.022
cntfr 7.493 6.135 12.552 11.579 13.288 8.968 6.933
epha4a 0.348 0.640 0.687 10.365 0.773 9.833 0.222
cadm4 0.145 0.288 0.343 0.659 1.144 0.167 0.400
sema3fb 0.203 0.883 0.179 6.476 0.523 6.683 0.089

5.2 r1/r2/r5/r6 over r3/r4

# VlnPlot(HB.int, features = rownames(Restoverr34_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
#         idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend()
# kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
#                         features = rownames(Restoverr34_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
#   dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
#   kable_classic_2(full_width = F)

6. Compare r5 & r6 to rest

r56vsRest_markers <- FindMarkers(HB.int, 
                                 ident.1 = c("r5","r6"), 
                                 ident.2 = c("r1","r1&r2","r2","r3","r4"), verbose = FALSE)
avg_r56vsRest <- AverageExpression(HB.int, features = rownames(r56vsRest_markers), assays = "SCT")$SCT
avg_r56vsRest <- as.data.frame(avg_r56vsRest) %>%
  select(r1, r2, r3, r4, r5, r6)
r56vsRest_m_avg <- cbind(r56vsRest_markers,avg_r56vsRest)
r56overRest_m_avg <- r56vsRest_m_avg %>%
  filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r5 > 0 & r6 > 0)
r56overRest_m_avg
# Restoverr56_m_avg <- r56vsRest_m_avg %>%
#   filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r1 > 0 & r2 > 0 & r3 > 0 & r4 > 0)
# Restoverr56_m_avg

6.1 r5/r6 over r1/r2/r3/r4

p56 <- VlnPlot(HB.int, features = rownames(r56overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
        idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
  theme(axis.title.x = element_blank())
p56

kableExtra::kbl(as.data.frame(
  round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
                        features = rownames(r56overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
  dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
  kable_classic_2(full_width = F)
r1 r1&r2 r2 r3 r4 r5 r6
hoxa4a 0.000 0.072 0.015 0.000 0.015 3.778 2.367
mafba 0.029 0.144 0.000 0.016 0.114 2.865 3.356
hoxb3a 0.043 0.135 0.000 0.508 0.652 3.381 2.789
evx1 0.014 0.036 0.000 0.016 0.061 0.825 0.456
si:ch211-216b21.2 0.058 0.243 0.045 0.111 0.015 1.238 0.878
tenm4 3.899 5.486 9.507 3.746 1.955 8.389 12.033
gria1a 0.014 0.027 0.045 0.206 0.008 1.405 0.067
col11a1b 0.072 0.081 0.119 0.095 0.114 0.802 1.489
hoxd3a 0.029 0.090 0.000 0.008 0.015 0.087 1.122
ptprua 0.101 0.135 0.179 0.151 0.106 2.444 0.411
sema3ab 0.014 0.027 0.015 0.254 0.008 1.468 0.033
cyp26c1 0.696 1.018 1.388 0.302 0.818 1.802 5.467
ackr3b 0.319 0.351 0.313 0.810 0.371 2.571 0.856
dclk2a 0.275 0.270 0.179 0.548 0.258 1.175 1.467
antxr1c 0.101 0.135 0.075 0.071 0.114 0.508 1.000
tshz3b 0.029 0.045 0.045 0.063 0.492 0.929 0.544
zgc:158328 0.029 0.117 0.194 0.087 0.500 0.738 1.633
tiam1a 0.594 1.036 1.119 0.690 0.848 2.413 1.400
cxcl12a 0.319 0.333 1.507 0.333 0.970 1.563 1.900
nhsl1a 0.043 0.216 0.134 0.111 0.061 0.460 0.956
iqca1 0.101 0.081 0.030 0.262 0.045 0.881 0.289
inavaa 0.014 0.477 0.164 0.635 0.485 2.143 1.089
tox3 0.710 0.946 1.403 2.397 0.598 3.325 2.000
cbfa2t2 0.464 0.135 0.194 0.452 0.227 1.135 0.700
rarab 0.696 0.811 0.567 0.825 1.114 1.675 1.878
nck2a 1.000 1.892 1.955 2.238 1.250 3.976 2.944
nos1apa.1 1.855 1.333 1.493 1.746 1.485 2.659 3.700
dennd5b 0.841 1.000 1.209 0.524 0.735 1.849 2.233
magi2a 1.029 0.757 1.343 0.849 0.909 3.262 2.000
map7d1a 2.014 1.568 1.299 0.746 1.447 2.214 3.067
adgrl1a 0.420 1.333 0.507 0.857 2.394 2.881 3.378
rnf165a 0.710 1.216 0.627 0.984 1.106 2.302 1.911
vat1 0.174 0.324 0.642 0.341 0.409 1.063 0.911
col15a1b 0.145 0.667 0.254 0.254 0.492 1.802 0.822
chl1a 0.261 0.297 0.090 0.111 0.076 0.310 1.378
midn 0.522 1.126 1.269 3.429 1.030 4.508 1.444
dbn1 0.522 0.865 0.582 1.254 1.258 2.159 2.422
dtnba 0.696 0.559 1.940 1.333 1.803 2.349 2.400
timp2b 0.087 0.252 0.119 2.802 0.030 2.937 0.067
adgrl3.1 0.696 0.730 0.642 0.849 0.894 1.786 1.211
epha4l 0.319 0.829 0.552 1.365 0.561 2.095 0.856
ctnna2 0.275 0.324 0.552 0.349 0.917 1.119 1.644
col12a1a 0.391 0.477 0.448 0.381 0.348 0.810 1.911
sema3fb 0.203 0.883 0.179 6.476 0.523 6.683 0.089
epha4a 0.348 0.640 0.687 10.365 0.773 9.833 0.222
tenm3 1.246 1.144 0.657 1.270 0.742 2.603 0.978
jag1a 0.130 0.036 0.045 0.151 0.045 0.857 0.333

6.2 r1/r2/r3/r4 over r5/r6

# VlnPlot(HB.int, features = rownames(Restoverr56_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)), 
#         idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() 
# kableExtra::kbl(as.data.frame(
#   round(AverageExpression(HB.int, assays = "SCT", slot = "data", 
#                         features = rownames(Restoverr56_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
#   dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
#   kable_classic_2(full_width = F)
write.table(r135vs246_m_avg, file = "../results/rhom_DEgenes_135vs246.txt", sep = "\t", quote = FALSE, col.names = NA)
write.table(r12vsRest_m_avg, file = "../results/rhom_DEgenes_12vs3456.txt", sep = "\t", quote = FALSE, col.names = NA)
write.table(r34vsRest_m_avg, file = "../results/rhom_DEgenes_34vs1256.txt", sep = "\t", quote = FALSE, col.names = NA)
write.table(r56vsRest_m_avg, file = "../results/rhom_DEgenes_56vs1234.txt", sep = "\t", quote = FALSE, col.names = NA)
combined <- 
  (((heatmapPlot.13) +
      #plot_spacer() +
     (heatmapPlot.16) #+ 
     #plot_layout(widths = c(2,0.1,2))
  ) /
  ((plot_spacer()) +
     ((p135 / plot_spacer() / p246 / plot_spacer() / p12 / plot_spacer() / p34) + 
        plot_layout(heights = c(17,0.1,6,0.1,13,0.1,5))) + 
     #plot_spacer() +
     (p56) +
     plot_layout(widths = c(3,1,1))
  )) + 
  plot_layout(heights = c(1,1.5))
combined

ggsave(filename = "../results/Fig5_combinedPlot.png", plot = combined)
Saving 31.2 x 31.2 in image
sessionInfo()
R version 4.1.0 (2021-05-18)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS 12.3

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats4    stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] harmony_0.1.0                       Rcpp_1.0.7                          AnnotationHub_3.2.0                
 [4] BiocFileCache_2.2.0                 dbplyr_2.1.1                        motifmatchr_1.16.0                 
 [7] TFBSTools_1.32.0                    patchwork_1.1.2                     JASPAR2020_0.99.10                 
[10] limma_3.50.3                        ggsci_2.9                           ggplot2_3.4.0                      
[13] dplyr_1.0.7                         kableExtra_1.3.4                    knitr_1.36                         
[16] Signac_1.2.1                        BSgenome.Drerio.UCSC.danRer11_1.4.2 BSgenome_1.62.0                    
[19] rtracklayer_1.54.0                  Biostrings_2.62.0                   XVector_0.34.0                     
[22] GenomicRanges_1.46.0                GenomeInfoDb_1.30.0                 org.Dr.eg.db_3.14.0                
[25] AnnotationDbi_1.56.1                IRanges_2.28.0                      S4Vectors_0.32.4                   
[28] Biobase_2.54.0                      BiocGenerics_0.40.0                 SeuratObject_4.0.4                 
[31] Seurat_4.0.1                       

loaded via a namespace (and not attached):
  [1] rappdirs_0.3.3                SnowballC_0.7.0               scattermore_0.7              
  [4] R.methodsS3_1.8.1             tidyr_1.1.4                   bit64_4.0.5                  
  [7] irlba_2.3.3                   DelayedArray_0.20.0           R.utils_2.11.0               
 [10] data.table_1.14.2             rpart_4.1-15                  KEGGREST_1.34.0              
 [13] RCurl_1.98-1.5                generics_0.1.1                cowplot_1.1.1                
 [16] RSQLite_2.2.8                 RANN_2.6.1                    future_1.26.1                
 [19] bit_4.0.4                     tzdb_0.2.0                    spatstat.data_2.1-0          
 [22] webshot_0.5.4                 xml2_1.3.3                    httpuv_1.6.3                 
 [25] SummarizedExperiment_1.24.0   assertthat_0.2.1              DirichletMultinomial_1.36.0  
 [28] xfun_0.27                     hms_1.1.1                     jquerylib_0.1.4              
 [31] evaluate_0.14                 promises_1.2.0.1              fansi_0.5.0                  
 [34] restfulr_0.0.13               caTools_1.18.2                igraph_1.2.8                 
 [37] DBI_1.1.1                     htmlwidgets_1.5.4             sparsesvd_0.2                
 [40] spatstat.geom_2.3-0           purrr_0.3.4                   ellipsis_0.3.2               
 [43] annotate_1.72.0               deldir_1.0-6                  MatrixGenerics_1.6.0         
 [46] vctrs_0.5.0                   ROCR_1.0-11                   abind_1.4-5                  
 [49] cachem_1.0.6                  withr_2.5.0                   ggforce_0.3.3                
 [52] sctransform_0.3.3             GenomicAlignments_1.30.0      goftest_1.2-3                
 [55] svglite_2.1.0                 cluster_2.1.2                 ape_5.6-2                    
 [58] lazyeval_0.2.2                seqLogo_1.60.0                crayon_1.4.2                 
 [61] labeling_0.4.2                pkgconfig_2.0.3               slam_0.1-48                  
 [64] tweenr_1.0.2                  nlme_3.1-153                  rlang_1.0.6                  
 [67] globals_0.15.1                lifecycle_1.0.3               miniUI_0.1.1.1               
 [70] filelock_1.0.2                polyclip_1.10-0               matrixStats_0.61.0           
 [73] lmtest_0.9-38                 Matrix_1.3-4                  ggseqlogo_0.1                
 [76] zoo_1.8-9                     ggridges_0.5.3                png_0.1-7                    
 [79] viridisLite_0.4.0             rjson_0.2.20                  bitops_1.0-7                 
 [82] R.oo_1.24.0                   KernSmooth_2.23-20            blob_1.2.2                   
 [85] stringr_1.4.0                 parallelly_1.32.0             readr_2.0.2                  
 [88] CNEr_1.30.0                   scales_1.2.1                  memoise_2.0.0                
 [91] magrittr_2.0.1                plyr_1.8.6                    ica_1.0-2                    
 [94] zlibbioc_1.40.0               compiler_4.1.0                BiocIO_1.4.0                 
 [97] RColorBrewer_1.1-2            fitdistrplus_1.1-6            Rsamtools_2.10.0             
[100] cli_3.4.1                     listenv_0.8.0                 pbapply_1.5-0                
[103] MASS_7.3-54                   mgcv_1.8-38                   tidyselect_1.1.1             
[106] stringi_1.7.5                 highr_0.9                     yaml_2.2.1                   
[109] ggrepel_0.9.1                 grid_4.1.0                    sass_0.4.0                   
[112] fastmatch_1.1-3               tools_4.1.0                   future.apply_1.8.1           
[115] parallel_4.1.0                rstudioapi_0.13               TFMPvalue_0.0.8              
[118] lsa_0.73.2                    gridExtra_2.3                 farver_2.1.0                 
[121] Rtsne_0.15                    digest_0.6.28                 BiocManager_1.30.19          
[124] shiny_1.7.1                   pracma_2.3.3                  qlcMatrix_0.9.7              
[127] BiocVersion_3.14.0            later_1.3.0                   RcppAnnoy_0.0.19             
[130] httr_1.4.2                    colorspace_2.0-2              rvest_1.0.3                  
[133] XML_3.99-0.8                  tensor_1.5                    reticulate_1.22              
[136] splines_4.1.0                 uwot_0.1.10                   RcppRoll_0.3.0               
[139] spatstat.utils_2.2-0          renv_0.15.5                   plotly_4.10.0                
[142] systemfonts_1.0.4             xtable_1.8-4                  jsonlite_1.7.2               
[145] poweRlaw_0.70.6               R6_2.5.1                      pillar_1.6.4                 
[148] htmltools_0.5.2               mime_0.12                     glue_1.6.2                   
[151] fastmap_1.1.0                 BiocParallel_1.28.0           interactiveDisplayBase_1.32.0
[154] codetools_0.2-18              utf8_1.2.2                    lattice_0.20-45              
[157] bslib_0.3.1                   spatstat.sparse_2.0-0         tibble_3.1.6                 
[160] curl_4.3.2                    leiden_0.3.9                  gtools_3.9.2                 
[163] GO.db_3.14.0                  survival_3.2-13               rmarkdown_2.11               
[166] docopt_0.7.1                  munsell_0.5.0                 GenomeInfoDbData_1.2.7       
[169] reshape2_1.4.4                gtable_0.3.0                  spatstat.core_2.3-0          
LS0tCnRpdGxlOiAiRmlndXJlIDUgUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgbGlicmFyaWVzLCByZXN1bHRzPUZ9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShTZXVyYXQpCiAgbGlicmFyeShvcmcuRHIuZWcuZGIpCiAgbGlicmFyeShCU2dlbm9tZS5EcmVyaW8uVUNTQy5kYW5SZXIxMSkKICBsaWJyYXJ5KFNpZ25hYykKICBsaWJyYXJ5KGtuaXRyKQogIGxpYnJhcnkoa2FibGVFeHRyYSkKICBsaWJyYXJ5KGRwbHlyKQogIGxpYnJhcnkoZ2dwbG90MikKICBsaWJyYXJ5KGdnc2NpKQogIGxpYnJhcnkobGltbWEpCiAgbGlicmFyeShKQVNQQVIyMDIwKQogIGxpYnJhcnkocGF0Y2h3b3JrKQogIGxpYnJhcnkoVEZCU1Rvb2xzKQogIGxpYnJhcnkobW90aWZtYXRjaHIpCiAgbGlicmFyeShBbm5vdGF0aW9uSHViKQogIGxpYnJhcnkoaGFybW9ueSkKfSkKb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gNDAwMCAqIDEwMjReMikKYGBgCgpgYGB7ciBteXBhbH0KbXlwYWwgPC0gcGFsX2lndihwYWxldHRlID0gImRlZmF1bHQiLGFscGhhID0gMSkoMzApCmBgYAoKIyAyLiBSZWFkIGRhdGEKCmBgYHtyfQpIQjEzaHBmIDwtIHJlYWRSRFMoZmlsZSA9ICJSRFNmaWxlcy9IQjEzaHBmX25ldXJhbC5SRFMiKQpEZWZhdWx0QXNzYXkoSEIxM2hwZikgPC0gIlNDVCIKSWRlbnRzKEhCMTNocGYpIDwtICJDbHVzdGVycyIKSEIxNmhwZiA8LSByZWFkUkRTKGZpbGUgPSAiUkRTZmlsZXMvSEIxNmhwZl9uZXVyYWwuUkRTIikKRGVmYXVsdEFzc2F5KEhCMTZocGYpIDwtICJTQ1QiCklkZW50cyhIQjE2aHBmKSA8LSAiQ2x1c3RlcnMiCmBgYAoKYGBge3J9CkhCLmludCA8LSByZWFkUkRTKGZpbGUgPSAiUkRTZmlsZXMvaW50Lm5ldXJhbC4zV1Quc3Vic2V0LlJEUyIpCkRlZmF1bHRBc3NheShIQi5pbnQpIDwtICJTQ1QiCkRpbVBsb3QoSEIuaW50LCByZWR1Y3Rpb24gPSAid25uLnVtYXAiKSArIHNjYWxlX2NvbG9yX2lndigpCmBgYAoKYGBge3J9CkhCLmludCRpbnRDbHVzdGVycyA8LSBhcy5jaGFyYWN0ZXIoSEIuaW50JGludENsdXN0ZXJzKQpIQi5pbnQkaW50Q2x1c3RlcnNbSEIuaW50JGludENsdXN0ZXJzICVpbiUgYygicjEmcjIuMSIsInIxJnIyLjIiKV0gPC0gInIxJnIyIgpIQi5pbnQkaW50Q2x1c3RlcnNbSEIuaW50JGludENsdXN0ZXJzICVpbiUgYygicjMuMSIpXSA8LSAicjMiCkhCLmludCRpbnRDbHVzdGVyc1tIQi5pbnQkaW50Q2x1c3RlcnMgJWluJSBjKCJyNC4xIiwicjQuMiIpXSA8LSAicjQiCkhCLmludCRpbnRDbHVzdGVyc1tIQi5pbnQkaW50Q2x1c3RlcnMgJWluJSBjKCJyNS4xIiwicjUuMiIpXSA8LSAicjUiCkhCLmludCRpbnRDbHVzdGVyc1tIQi5pbnQkaW50Q2x1c3RlcnMgJWluJSBjKCJyNi4xIiwicjYuMiIpXSA8LSAicjYiCkhCLmludCRpbnRDbHVzdGVycyA8LSBkcm9wbGV2ZWxzKGFzLmZhY3RvcihIQi5pbnQkaW50Q2x1c3RlcnMpKQpJZGVudHMoSEIuaW50KSA8LSAiaW50Q2x1c3RlcnMiCmxldmVscyhIQi5pbnQpCmBgYAoKYGBge3J9CmxldmVscyhIQi5pbnQpIDwtIGMoInIxIiwicjEmcjIiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiwiQ2F1ZEhCLjEiLCJDYXVkSEIuMiIsIkNhdWRIQi4zIiwiQ2F1ZEhCLjQiLCJDaWxpYXRlZCIsIkhCIiwiTUIuMSIsIk1CLjIiLAogICAgICAgICAgICAgICAgICAgICJNQi4zIiwiTUhCLjEiLCJNSEIuMiIsIk1IQi4zIiwiTUhCLjQiLCJNSEIuNSIsIk1IQi42IiwiTWl0b2Nob25kcmlhbCIsIk5DLjEiLCJOQy4yIiwiTmV1cm9nIiwiTmV1cm9uLjEiLCAKICAgICAgICAgICAgICAgICAgICAiTmV1cm9uLjIiLCJTQy4xIiwiU0MuMiIsIlNDLjMiLCJTQy40IikKYGBgCgojIDMuIEhlYXRtYXBzCgojIyAzLjEgSEIxM2hwZiB0b3A1IERFIGdlbmVzCmBgYHtyIG1hcmtlcnMuMTMsIHJlc3VsdHM9Rn0KQWxsLm1hcmtlcnMuMTMgPC0gRmluZEFsbE1hcmtlcnMoSEIxM2hwZiwgb25seS5wb3MgPSBULCB2ZXJib3NlID0gRikKYGBgCgpgYGB7ciB0b3A1LjEzfQp0b3A1LnB2YWwuMTMgPC0gQWxsLm1hcmtlcnMuMTMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPS01LCB3dCA9IHBfdmFsKSAlPiUgdG9wX24obj01LCB3dCA9IGF2Z19sb2cyRkMpCnRvcDUucHZhbC4xMwpgYGAKCmBgYHtyIGhlYXRtYXAuMTMsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTd9CklkZW50cyhIQjEzaHBmKSA8LSAiQ2x1c3RlcnMiCkhCMTNocGYgPC0gUmVuYW1lSWRlbnRzKEhCMTNocGYsICJGQi4xIiA9ICJGQi4xICAgICAgICIpICMjIHRoaXMgbWFrZXMgdGhlIGxlbmd0aCBvZiBsb25nZXN0IG5hbWUgc2FtZSBhcyBIQjE2aHBmIHNvIHRoZXkgZXZlbiBpbiBjb21iaW5lZCBwbG90CmhlYXRtYXBQbG90LjEzIDwtIERvSGVhdG1hcChIQjEzaHBmLCBmZWF0dXJlcyA9IHVuaXF1ZSh0b3A1LnB2YWwuMTMkZ2VuZSksIGdyb3VwLmNvbG9ycyA9IG15cGFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA1LCBhbmdsZSA9IDQ1KSArIAogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpKQpoZWF0bWFwUGxvdC4xMwpgYGAKCiMjIDMuMiBIQjE2aHBmIHRvcDUgREUgZ2VuZXMKYGBge3IgbWFya2Vycy4xNiwgcmVzdWx0cz1GfQpBbGwubWFya2Vycy4xNiA8LSBGaW5kQWxsTWFya2VycyhIQjE2aHBmLCBvbmx5LnBvcyA9IFQsIHZlcmJvc2UgPSBGKQpgYGAKCmBgYHtyIHRvcDUuMTZ9CnRvcDUucHZhbC4xNiA8LSBBbGwubWFya2Vycy4xNiAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG49LTUsIHd0ID0gcF92YWwpICU+JSB0b3BfbihuPTUsIHd0ID0gYXZnX2xvZzJGQykKdG9wNS5wdmFsLjE2CmBgYAoKYGBge3IgaGVhdG1hcC4xNiwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9N30KaGVhdG1hcFBsb3QuMTYgPC0gRG9IZWF0bWFwKEhCMTZocGYsIGZlYXR1cmVzID0gdW5pcXVlKHRvcDUucHZhbC4xNiRnZW5lKSwgZ3JvdXAuY29sb3JzID0gbXlwYWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDUsIGFuZ2xlID0gNDUpICsgCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpCmhlYXRtYXBQbG90LjE2CmBgYAoKIyAzLiBDb21wYXJlIHIxLCByMyAmIHI1IHRvIHIyLCByNCBhbmQgcjYKYGBge3IgbWFya2VyczEzNX0KcjEzNXZzMjQ2X21hcmtlcnMgPC0gRmluZE1hcmtlcnMoSEIuaW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoInIxIiwicjMiLCJyNSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoInIyIiwicjQiLCJyNiIpLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKYGBge3IgYXZnMTM1fQphdmdfcjEzNXZzMjQ2IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMTM1dnMyNDZfbWFya2VycyksIGFzc2F5cyA9ICJTQ1QiKSRTQ1QKYXZnX3IxMzV2czI0NiA8LSBhcy5kYXRhLmZyYW1lKGF2Z19yMTM1dnMyNDYpICU+JQogIHNlbGVjdChyMSwgcjIsIHIzLCByNCwgcjUsIHI2KQpyMTM1dnMyNDZfbV9hdmcgPC0gY2JpbmQocjEzNXZzMjQ2X21hcmtlcnMsYXZnX3IxMzV2czI0NikKYGBgCgoKYGBge3IgdGFibGUxMzV9CnIxMzVvdmVyMjQ2X21fYXZnIDwtIHIxMzV2czI0Nl9tX2F2ZyAlPiUKICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGF2Z19sb2cyRkMgPiAwLjUgJiByMSA+IDAgJiByMyA+IDAgJiByNSA+IDApCnIxMzVvdmVyMjQ2X21fYXZnCmBgYAoKYGBge3IgdGFibGUyNDZ9CnIyNDZvdmVyMTM1X21fYXZnIDwtIHIxMzV2czI0Nl9tX2F2ZyAlPiUKICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGF2Z19sb2cyRkMgPCAtMC41ICYgcjIgPiAwICYgcjQgPiAwICYgcjYgPiAwKQpyMjQ2b3ZlcjEzNV9tX2F2ZwpgYGAKCiMjIDMuMSByMS9yMy9yNSBvdmVyIHIyL3I0L3I2CmBgYHtyIHZsbjEzNSwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NX0KcDEzNSA8LSBWbG5QbG90KEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMTM1b3ZlcjI0Nl9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSwgCiAgICAgICAgaWRlbnRzID0gYygicjEiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiksIHN0YWNrID0gVFJVRSwgZmxpcCA9IFRSVUUsIGZpbGwuYnkgPSAiaWRlbnQiLCBjb2xzID0gbXlwYWwpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpwMTM1CmBgYAoKYGBge3Iga2FibGUxMzV9CmthYmxlRXh0cmE6OmtibChhcy5kYXRhLmZyYW1lKHJvdW5kKEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgYXNzYXlzID0gIlNDVCIsIHNsb3QgPSAiZGF0YSIsIAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IHJvd25hbWVzKHIxMzVvdmVyMjQ2X21fYXZnICU+JSBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGFicyhhdmdfbG9nMkZDKSA+IDAuNSkpKSRTQ1QsMykpICU+JQogIGRwbHlyOjpzZWxlY3QocjEsICdyMSZyMicsIHIyLCByMywgcjQsIHI1LCByNikpICU+JQogIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikKYGBgCgojIyAzLjEgcjIvcjQvcjYgb3ZlciByMS9yMy9yNQpgYGB7ciB2bG4yNDYsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTV9CnAyNDYgPC0gVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjI0Nm92ZXIxMzVfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAogICAgICAgIGlkZW50cyA9IGMoInIxIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIpLCBzdGFjayA9IFRSVUUsIGZsaXAgPSBUUlVFLCBmaWxsLmJ5ID0gImlkZW50IiwgY29scyA9IG15cGFsKSArIE5vTGVnZW5kKCkgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKcDI0NgpgYGAKCmBgYHtyIGthYmxlMjQ2fQprYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZShyb3VuZChBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGFzc2F5cyA9ICJTQ1QiLCBzbG90ID0gImRhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhyMjQ2b3ZlcjEzNV9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEYpCmBgYAoKCiMgNC4gQ29tcGFyZSByMSAmIHIyIHRvIHJlc3QKYGBge3IgbWFya2VyczEyfQpyMTJ2c1Jlc3RfbWFya2VycyA8LSBGaW5kTWFya2VycyhIQi5pbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygicjEiLCJyMSZyMiIsInIyIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygicjMiLCJyNSIsInI0IiwicjYiKSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCmBgYHtyIGF2ZzEyfQphdmdfcjEydnNSZXN0IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMTJ2c1Jlc3RfbWFya2VycyksIGFzc2F5cyA9ICJTQ1QiKSRTQ1QKYXZnX3IxMnZzUmVzdCA8LSBhcy5kYXRhLmZyYW1lKGF2Z19yMTJ2c1Jlc3QpICU+JQogIHNlbGVjdChyMSwgcjIsIHIzLCByNCwgcjUsIHI2KQpyMTJ2c1Jlc3RfbV9hdmcgPC0gY2JpbmQocjEydnNSZXN0X21hcmtlcnMsYXZnX3IxMnZzUmVzdCkKYGBgCgoKYGBge3IgdGFibGUxMn0KcjEyb3ZlclJlc3RfbV9hdmcgPC0gcjEydnNSZXN0X21fYXZnICU+JQogIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYXZnX2xvZzJGQyA+IDAuNSAmIHIxID4gMCAmIHIyID4gMCkKcjEyb3ZlclJlc3RfbV9hdmcKYGBgCgpgYGB7ciB0YWJsZTM0NTZ9CiMgUmVzdG92ZXJyMTJfbV9hdmcgPC0gcjEydnNSZXN0X21fYXZnICU+JQojICAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhdmdfbG9nMkZDIDwgLTAuNSAmIHIzID4gMCAmIHI0ID4gMCAmIHI1ID4gMCAmIHI2ID4gMCkKIyBSZXN0b3ZlcnIxMl9tX2F2ZwpgYGAKCiMjIDQuMSByMS9yMiBvdmVyIHIzL3I0L3I1L3I2CmBgYHtyIHZsbjEyLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD04fQpwMTIgPC0gVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjEyb3ZlclJlc3RfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAogICAgICAgIGlkZW50cyA9IGMoInIxIiwicjEmcjIiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiksIHN0YWNrID0gVFJVRSwgZmxpcCA9IFRSVUUsIGZpbGwuYnkgPSAiaWRlbnQiLCBjb2xzID0gbXlwYWwpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpwMTIKYGBgCgpgYGB7ciBrYWJsZTEyfQprYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZShyb3VuZChBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGFzc2F5cyA9ICJTQ1QiLCBzbG90ID0gImRhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhyMTJvdmVyUmVzdF9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEYpCmBgYAoKIyMgNC4yIHIzL3I0L3I1L3I2IG92ZXIgcjEvcjIKYGBge3IgdmxuMzQ1NiwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9OH0KIyBWbG5QbG90KEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhSZXN0b3ZlcnIxMl9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSwgCiMgICAgICAgICBpZGVudHMgPSBjKCJyMSIsInIxJnIyIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIpLCBzdGFjayA9IFRSVUUsIGZsaXAgPSBUUlVFLCBmaWxsLmJ5ID0gImlkZW50IiwgY29scyA9IG15cGFsKSArIE5vTGVnZW5kKCkKYGBgCgpgYGB7ciBrYWJsZTM0NTZ9CiMga2FibGVFeHRyYTo6a2JsKGFzLmRhdGEuZnJhbWUocm91bmQoQXZlcmFnZUV4cHJlc3Npb24oSEIuaW50LCBhc3NheXMgPSAiU0NUIiwgc2xvdCA9ICJkYXRhIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhSZXN0b3ZlcnIxMl9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKIyAgIGRwbHlyOjpzZWxlY3QocjEsICdyMSZyMicsIHIyLCByMywgcjQsIHI1LCByNikpICU+JQojICAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKQpgYGAKCiMgNS4gQ29tcGFyZSByMyAmIHI0IHRvIHJlc3QKYGBge3IgbWFya2VyczM0fQpyMzR2c1Jlc3RfbWFya2VycyA8LSBGaW5kTWFya2VycyhIQi5pbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygicjMiLCJyNCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoInIxIiwicjEmcjIiLCJyMiIsInI1IiwicjYiKSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCmBgYHtyIGF2ZzM0fQphdmdfcjM0dnNSZXN0IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMzR2c1Jlc3RfbWFya2VycyksIGFzc2F5cyA9ICJTQ1QiKSRTQ1QKYXZnX3IzNHZzUmVzdCA8LSBhcy5kYXRhLmZyYW1lKGF2Z19yMzR2c1Jlc3QpICU+JQogIHNlbGVjdChyMSwgcjIsIHIzLCByNCwgcjUsIHI2KQpyMzR2c1Jlc3RfbV9hdmcgPC0gY2JpbmQocjM0dnNSZXN0X21hcmtlcnMsYXZnX3IzNHZzUmVzdCkKYGBgCgpgYGB7ciB0YWJsZTM0fQpyMzRvdmVyUmVzdF9tX2F2ZyA8LSByMzR2c1Jlc3RfbV9hdmcgJT4lCiAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhdmdfbG9nMkZDID4gMC41ICYgcjMgPiAwICYgcjQgPiAwKQpyMzRvdmVyUmVzdF9tX2F2ZwpgYGAKCmBgYHtyIHRhYmxlMTI1Nn0KIyBSZXN0b3ZlcnIzNF9tX2F2ZyA8LSByMzR2c1Jlc3RfbV9hdmcgJT4lCiMgICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGF2Z19sb2cyRkMgPCAtMC41ICYgcjEgPiAwICYgcjIgPiAwICYgcjUgPiAwICYgcjYgPiAwKQojIFJlc3RvdmVycjM0X21fYXZnCmBgYAojIyA1LjEgcjMvcjQgb3ZlciByMS9yMi9yNS9yNgpgYGB7ciB2bG4zNCwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NX0KcDM0IDwtIFZsblBsb3QoSEIuaW50LCBmZWF0dXJlcyA9IHJvd25hbWVzKHIzNG92ZXJSZXN0X21fYXZnICU+JSBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGFicyhhdmdfbG9nMkZDKSA+IDAuNSkpLCAKICAgICAgICBpZGVudHMgPSBjKCJyMSIsInIxJnIyIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIpLCBzdGFjayA9IFRSVUUsIGZsaXAgPSBUUlVFLCBmaWxsLmJ5ID0gImlkZW50IiwgY29scyA9IG15cGFsKSArIE5vTGVnZW5kKCkgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKcDM0CmBgYAoKYGBge3Iga2FibGUzNH0Ka2FibGVFeHRyYTo6a2JsKGFzLmRhdGEuZnJhbWUocm91bmQoQXZlcmFnZUV4cHJlc3Npb24oSEIuaW50LCBhc3NheXMgPSAiU0NUIiwgc2xvdCA9ICJkYXRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gcm93bmFtZXMocjM0b3ZlclJlc3RfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSkpJFNDVCwzKSkgJT4lCiAgZHBseXI6OnNlbGVjdChyMSwgJ3IxJnIyJywgcjIsIHIzLCByNCwgcjUsIHI2KSkgJT4lCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKQpgYGAKCiMjIDUuMiByMS9yMi9yNS9yNiBvdmVyIHIzL3I0CmBgYHtyIHZsbjEyNTYsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTV9CiMgVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyMzRfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAojICAgICAgICAgaWRlbnRzID0gYygicjEiLCJyMSZyMiIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiKSwgc3RhY2sgPSBUUlVFLCBmbGlwID0gVFJVRSwgZmlsbC5ieSA9ICJpZGVudCIsIGNvbHMgPSBteXBhbCkgKyBOb0xlZ2VuZCgpCmBgYAoKYGBge3Iga2FibGUxMjU2fQojIGthYmxlRXh0cmE6OmtibChhcy5kYXRhLmZyYW1lKHJvdW5kKEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgYXNzYXlzID0gIlNDVCIsIHNsb3QgPSAiZGF0YSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyMzRfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSkpJFNDVCwzKSkgJT4lCiMgICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKIyAgIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikKYGBgCgojIDYuIENvbXBhcmUgcjUgJiByNiB0byByZXN0CmBgYHtyIG1hcmtlcnM1Nn0KcjU2dnNSZXN0X21hcmtlcnMgPC0gRmluZE1hcmtlcnMoSEIuaW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoInI1IiwicjYiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJyMSIsInIxJnIyIiwicjIiLCJyMyIsInI0IiksIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgpgYGB7ciBhdmc1Nn0KYXZnX3I1NnZzUmVzdCA8LSBBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjU2dnNSZXN0X21hcmtlcnMpLCBhc3NheXMgPSAiU0NUIikkU0NUCmF2Z19yNTZ2c1Jlc3QgPC0gYXMuZGF0YS5mcmFtZShhdmdfcjU2dnNSZXN0KSAlPiUKICBzZWxlY3QocjEsIHIyLCByMywgcjQsIHI1LCByNikKcjU2dnNSZXN0X21fYXZnIDwtIGNiaW5kKHI1NnZzUmVzdF9tYXJrZXJzLGF2Z19yNTZ2c1Jlc3QpCmBgYAoKYGBge3IgdGFibGU1Nn0KcjU2b3ZlclJlc3RfbV9hdmcgPC0gcjU2dnNSZXN0X21fYXZnICU+JQogIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYXZnX2xvZzJGQyA+IDAuNSAmIHI1ID4gMCAmIHI2ID4gMCkKcjU2b3ZlclJlc3RfbV9hdmcKYGBgCgpgYGB7ciB0YWJsZTEyMzR9CiMgUmVzdG92ZXJyNTZfbV9hdmcgPC0gcjU2dnNSZXN0X21fYXZnICU+JQojICAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhdmdfbG9nMkZDIDwgLTAuNSAmIHIxID4gMCAmIHIyID4gMCAmIHIzID4gMCAmIHI0ID4gMCkKIyBSZXN0b3ZlcnI1Nl9tX2F2ZwpgYGAKIyMgNi4xIHI1L3I2IG92ZXIgcjEvcjIvcjMvcjQKYGBge3IgdmxuNTYsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTEwfQpwNTYgPC0gVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjU2b3ZlclJlc3RfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAogICAgICAgIGlkZW50cyA9IGMoInIxIiwicjEmcjIiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiksIHN0YWNrID0gVFJVRSwgZmxpcCA9IFRSVUUsIGZpbGwuYnkgPSAiaWRlbnQiLCBjb2xzID0gbXlwYWwpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpwNTYKYGBgCgpgYGB7ciBrYWJsZTU2fQprYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZSgKICByb3VuZChBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGFzc2F5cyA9ICJTQ1QiLCBzbG90ID0gImRhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhyNTZvdmVyUmVzdF9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEYpCmBgYAoKIyMgNi4yIHIxL3IyL3IzL3I0IG92ZXIgcjUvcjYKYGBge3IgdmxuMTIzNCwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9MTB9CiMgVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyNTZfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAojICAgICAgICAgaWRlbnRzID0gYygicjEiLCJyMSZyMiIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiKSwgc3RhY2sgPSBUUlVFLCBmbGlwID0gVFJVRSwgZmlsbC5ieSA9ICJpZGVudCIsIGNvbHMgPSBteXBhbCkgKyBOb0xlZ2VuZCgpIApgYGAKCmBgYHtyIGthYmxlMTIzNH0KIyBrYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZSgKIyAgIHJvdW5kKEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgYXNzYXlzID0gIlNDVCIsIHNsb3QgPSAiZGF0YSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyNTZfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSkpJFNDVCwzKSkgJT4lCiMgICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKIyAgIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikKYGBgCgpgYGB7ciB3cml0ZX0Kd3JpdGUudGFibGUocjEzNXZzMjQ2X21fYXZnLCBmaWxlID0gIi4uL3Jlc3VsdHMvcmhvbV9ERWdlbmVzXzEzNXZzMjQ2LnR4dCIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UsIGNvbC5uYW1lcyA9IE5BKQp3cml0ZS50YWJsZShyMTJ2c1Jlc3RfbV9hdmcsIGZpbGUgPSAiLi4vcmVzdWx0cy9yaG9tX0RFZ2VuZXNfMTJ2czM0NTYudHh0Iiwgc2VwID0gIlx0IiwgcXVvdGUgPSBGQUxTRSwgY29sLm5hbWVzID0gTkEpCndyaXRlLnRhYmxlKHIzNHZzUmVzdF9tX2F2ZywgZmlsZSA9ICIuLi9yZXN1bHRzL3Job21fREVnZW5lc18zNHZzMTI1Ni50eHQiLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEZBTFNFLCBjb2wubmFtZXMgPSBOQSkKd3JpdGUudGFibGUocjU2dnNSZXN0X21fYXZnLCBmaWxlID0gIi4uL3Jlc3VsdHMvcmhvbV9ERWdlbmVzXzU2dnMxMjM0LnR4dCIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UsIGNvbC5uYW1lcyA9IE5BKQpgYGAKCmBgYHtyIGNvbWJpbmVkMiwgZmlnLmhlaWdodD0yNSwgZmlnLndpZHRoPTI1fQpjb21iaW5lZCA8LSAKICAoKChoZWF0bWFwUGxvdC4xMykgKwogICAgICAjcGxvdF9zcGFjZXIoKSArCiAgICAgKGhlYXRtYXBQbG90LjE2KSAjKyAKICAgICAjcGxvdF9sYXlvdXQod2lkdGhzID0gYygyLDAuMSwyKSkKICApIC8KICAoKHBsb3Rfc3BhY2VyKCkpICsKICAgICAoKHAxMzUgLyBwbG90X3NwYWNlcigpIC8gcDI0NiAvIHBsb3Rfc3BhY2VyKCkgLyBwMTIgLyBwbG90X3NwYWNlcigpIC8gcDM0KSArIAogICAgICAgIHBsb3RfbGF5b3V0KGhlaWdodHMgPSBjKDE3LDAuMSw2LDAuMSwxMywwLjEsNSkpKSArIAogICAgICNwbG90X3NwYWNlcigpICsKICAgICAocDU2KSArCiAgICAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygzLDEsMSkpCiAgKSkgKyAKICBwbG90X2xheW91dChoZWlnaHRzID0gYygxLDEuNSkpCmNvbWJpbmVkCmdnc2F2ZShmaWxlbmFtZSA9ICIuLi9yZXN1bHRzL0ZpZzVfY29tYmluZWRQbG90LnBuZyIsIHBsb3QgPSBjb21iaW5lZCkKYGBgCmBgYHtyIHNlc3Npb25pbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoK